<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //  1 3 2
        // console.log(1);
        // setTimeout(() => {
        //     console.log(2);
        // }, 2000);
        // console.log(3);

        //  1 3 2
        console.log(1);
        setTimeout(() => {
            console.log(2);
        }, 0);
        console.log(3);

        /**
         *  js是单线程--同一时间只能做一件事，耗时的任务会阻塞代码的执行,为了防止阻塞问题,为此有了同步和异步的概念
         * **/ 


        /**
         * 同步代码： 立即放入JS引擎(JS主线程)执行，并原地等待结果
         * **/  


        /**
         * 异步代码---共同点--耗时:
         * 先放入宿主环境(浏览器/Node,因为浏览器和Node可以多线程操作),不必原地等待结果，并不阻塞主线程继续往下执行，异步结果在将来执行
         * 然后异步代码等待时机成熟(比如定时器事件到了,点击事件触发)送入任务队列排队
         * 
         * setTimeOut(一次性定时器)
         * setInnterval(延时器)
         * ajax/Fetch
         * 事件绑定
         * Promise(本身是同步)里面的then(),catch()是异步
         * **/  

        /**
         * 执行栈执行完毕，会去任务队列看是否有异步任务，有就送到执行栈执行，反复循环查看执行--这个过程就是事件循环
         * **/ 
    </script>
</body>
</html>